/*
 * This file or a portion of this file is licensed under the terms of
 * the Globus Toolkit Public License, found in file GTPL, or at
 * http://www.globus.org/toolkit/download/license.html. This notice must
 * appear in redistributions of this file, with or without modification.
 *
 * Redistributions of this Software, with or without modification, must
 * reproduce the GTPL in: (1) the Software, or (2) the Documentation or
 * some other similar material which is provided with the Software (if
 * any).
 *
 * Copyright 1999-2004 University of Chicago and The University of
 * Southern California. All rights reserved.
 */

package org.griphyn.vdl.router;
import org.griphyn.vdl.classes.*;

/**
 * create a Diamond DAG exmample structure in memory using VDL classes.
 *
 * @author   Jens-S. Vöckler
 * @version  $Revision: 50 $
 */
public class CreateDiamond {

  /**
   * create a 4 node diamond DAG as in-memory data structures employing
   * the VDL classes. This is a test module for the router, until the
   * input (SAX) becomes available.
   *
   * @return a list of Transformations and Derivations, encapsulated
   *         as Definitions.
   */
  public static Definitions create()
  {
    // create result vector
    Definitions result = new Definitions( "test", "1.0" );

    try {
      // create "generate" transformation
      Transformation t1 = new Transformation( "generate" );
      t1.addProfile( new Profile( "hints", "pfnHint",
				  new Text("generator.exe") ) );
      t1.addDeclare( new Declare( "a", Value.SCALAR, LFN.OUTPUT ) );
      t1.addArgument( new Argument("stdout",new Use("a",LFN.OUTPUT)) );
      result.addDefinition( t1 );
      
      // create "findrange" transformation
      Transformation t2 = new Transformation( "findrange" );
      t2.addProfile( new Profile( "hints", "pfnHint",
				  new Text("findrange.exe") ) );
      Argument t2_arg1 = new Argument( "arg", new Text( "-i ") );
      t2_arg1.addLeaf( new Use("p", LFN.NONE) );
      t2.addDeclare( new Declare( "a", Value.SCALAR, LFN.INPUT ) );
      t2.addDeclare( new Declare( "b", Value.SCALAR, LFN.OUTPUT ) );
      t2.addDeclare( new Declare( "p", new Scalar( new Text("0.0") ) ) );
      t2.addArgument( t2_arg1 );
      t2.addArgument( new Argument( "stdin", new Use( "a", LFN.INPUT ) ) );
      t2.addArgument( new Argument( "stdout", new Use( "b", LFN.OUTPUT ) ) );
      result.addDefinition( t2 );
      
      // create "analyze" transformation
      Transformation t3 = new Transformation( "analyze" );
      t3.addProfile( new Profile( "hints", "pfnHint",
				  new Text("analyze.exe") ) );
      t3.addArgument( new Argument( "files", new Use( "a", "", " ", "" ) ) );
      t3.addArgument( new Argument( "stdout", new Use( "c", LFN.OUTPUT ) ) );
      t3.addDeclare( new Declare( "a", Value.LIST, LFN.INPUT ) );
      t3.addDeclare( new Declare( "c", Value.SCALAR, LFN.OUTPUT ) );
      result.addDefinition( t3 );
      
      // create "top" node derivation of "generate"
      Derivation d1 = 
	new Derivation( "top", "generate",
			new Pass( "a", 
				  new Scalar( new LFN("f.a",LFN.OUTPUT) ) ) );
      result.addDefinition( d1 );
      
      // create "left" node derivation of "findrange"
      Derivation d2 = new Derivation( "left", "findrange" );
      d2.addPass( new Pass( "b", new Scalar( new LFN("f.b",LFN.OUTPUT) ) ) );
      d2.addPass( new Pass( "a", new Scalar( new LFN("f.a",LFN.INPUT) ) ) );
      d2.addPass( new Pass( "p", new Scalar( new Text("0.5") ) ) );
      result.addDefinition( d2 );
      
      // create "right" node derivation of "findrange"
      Derivation d3 = new Derivation( "right", "findrange" );
      d3.addPass( new Pass( "a", new Scalar( new LFN("f.a",LFN.INPUT) ) ) );
      d3.addPass( new Pass( "b", new Scalar( new LFN("f.c",LFN.OUTPUT) ) ) );
      d3.addPass( new Pass( "p", new Scalar( new Text("1.0") ) ) );
      result.addDefinition( d3 );
      
      // create "bottom" node derivation of "analyze"
      Derivation d4 = new Derivation( "bottom", "analyze" );
      List d4_list1 = new List();
      d4_list1.addScalar( new Scalar( new LFN("f.b",LFN.INPUT) ) );
      d4_list1.addScalar( new Scalar( new LFN("f.c",LFN.INPUT) ) );
      d4.addPass( new Pass( "a", d4_list1 ) );
      d4.addPass( new Pass( "c", new Scalar( new LFN("f.d",LFN.OUTPUT) ) ) );
      result.addDefinition( d4 );
    }
    catch ( IllegalArgumentException iae ) {
      System.err.println( iae.getMessage() );
      System.exit(1);
    }

    // finally
    return result;
  }
}
